package core

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"path/filepath"
	"time"
)

var Logger = initLogger()

// initLogger 初始化zap日志
func initLogger() *zap.SugaredLogger {
	//zap.NewDevelopmentConfig()
	// 创建日志目录
	logDir := "logs"
	if err := os.MkdirAll(logDir, 0755); err != nil {
		panic("创建日志目录失败: " + err.Error())
	}

	// 按月生成日志文件名
	currentTime := time.Now()
	logFileName := filepath.Join(logDir, currentTime.Format("2006-01")+".log")

	// 创建日志文件
	logFile, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		panic("创建日志文件失败: " + err.Error())
	}

	// 配置编码器
	cfg := zap.NewProductionEncoderConfig()
	cfg.EncodeTime = zapcore.ISO8601TimeEncoder
	cfg.EncodeLevel = zapcore.CapitalLevelEncoder
	cfg.FunctionKey = "F"

	// 创建控制台和文件两种输出
	consoleEncoder := zapcore.NewConsoleEncoder(cfg)
	fileEncoder := zapcore.NewJSONEncoder(cfg)

	// 设置输出目标
	consoleDebugging := zapcore.Lock(os.Stdout)
	fileOutput := zapcore.Lock(logFile)

	// 创建核心 - 控制台输出Info级别及以上日志
	consoleCore := zapcore.NewCore(consoleEncoder, consoleDebugging, zapcore.InfoLevel)
	// 文件输出Warn级别及以上日志
	fileCore := zapcore.NewCore(fileEncoder, fileOutput, zapcore.WarnLevel)

	// 合并核心
	core := zapcore.NewTee(consoleCore, fileCore)

	logger := zap.New(core, zap.AddCaller())
	return logger.Sugar()
}
